package com.ruoyi.web.controller.tool.designpattern.behavioralPatterns.iterator;

import java.util.NoSuchElementException;

/**
 * 迭代器模式
 *
 * @author Hack2003
 * @date 2024/3/21 17:25
 **/
// 1. 定义一个抽象容器接口（可迭代集合）
interface Container {
    Iterator getIterator();
}

// 2. 定义一个抽象迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

// 3. 具体容器类
class ConcreteContainer implements Container {
    private Object[] elements = {"Apple", "Banana", "Cherry"};

    @Override
    public Iterator getIterator() {
        return new ConcreteIterator();
    }

    // 内部类作为具体的迭代器实现
    class ConcreteIterator implements Iterator {
        private int position = 0;

        @Override
        public boolean hasNext() {
            return position < elements.length;
        }

        @Override
        public Object next() {
            if (hasNext()) {
                return elements[position++];
            } else {
                throw new NoSuchElementException("没有更多的元素了");
            }
        }
    }
}

/**
 * 迭代器模式是一种行为型设计模式，
 * 它提供了一种方法来顺序访问聚合对象的元素，而又不需要暴露该对象的内部表示。
 * 在Java中，Iterator接口和Iterable接口是实现迭代器模式的关键。
 */
public class Test {
    public static void main(String[] args) {
        // 创建一个具体的容器
        Container container = new ConcreteContainer();
        // 获取迭代器
        Iterator iterator = container.getIterator();
        // 迭代输出
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
